// 微前端架构管理器
class MicroFrontendManager {
  constructor() {
    this.modules = new Map()
    this.currentModule = null
    this.themes = new Map()
    this.initialized = false
  }

  /**
   * 注册微前端模块
   * @param {string} name - 模块名称
   * @param {Object} config - 模块配置
   */
  registerModule(name, config) {
    const module = {
      name,
      path: config.path,
      component: config.component,
      layout: config.layout || 'default',
      theme: config.theme || 'default',
      meta: config.meta || {},
      permissions: config.permissions || [],
      dependencies: config.dependencies || [],
      initialized: false,
      instance: null
    }

    this.modules.set(name, module)
    console.log(`Module '${name}' registered successfully`)
    return module
  }

  /**
   * 初始化模块
   * @param {string} moduleName - 模块名称
   */
  async initModule(moduleName) {
    const module = this.modules.get(moduleName)
    if (!module) {
      throw new Error(`Module '${moduleName}' not found`)
    }

    if (module.initialized) {
      return module.instance
    }

    try {
      // 加载模块组件
      const Component = module.component
      module.instance = Component
      module.initialized = true

      // 应用模块主题
      this.applyModuleTheme(module.theme)

      console.log(`Module '${moduleName}' initialized`)
      return module.instance
    } catch (error) {
      console.error(`Failed to initialize module '${moduleName}':`, error)
      throw error
    }
  }

  /**
   * 切换到指定模块
   * @param {string} moduleName - 模块名称
   */
  async switchModule(moduleName) {
    // 清理当前模块
    if (this.currentModule) {
      this.cleanupModule(this.currentModule)
    }

    // 初始化新模块
    const moduleInstance = await this.initModule(moduleName)
    this.currentModule = moduleName

    // 更新主题
    const module = this.modules.get(moduleName)
    this.applyModuleTheme(module.theme)

    console.log(`Switched to module '${moduleName}'`)
    return moduleInstance
  }

  /**
   * 清理模块
   * @param {string} moduleName - 模块名称
   */
  cleanupModule(moduleName) {
    const module = this.modules.get(moduleName)
    if (module && module.instance) {
      // 执行清理逻辑
      if (module.instance.destroy) {
        module.instance.destroy()
      }

      // 重置主题
      this.resetTheme()

      module.initialized = false
      console.log(`Module '${moduleName}' cleaned up`)
    }
  }

  /**
   * 应用模块主题
   * @param {string} themeName - 主题名称
   */
  applyModuleTheme(themeName) {
    const theme = this.themes.get(themeName) || this.themes.get('default')
    if (theme) {
      // 移除现有主题样式
      document.body.className = document.body.className.replace(/theme-\S+/g, '')

      // 应用新主题
      document.body.classList.add(`theme-${themeName}`)

      // 更新CSS变量
      Object.keys(theme).forEach(key => {
        document.documentElement.style.setProperty(`--${key}`, theme[key])
      })

      console.log(`Theme '${themeName}' applied`)
    }
  }

  /**
   * 重置主题
   */
  resetTheme() {
    document.body.className = document.body.className.replace(/theme-\S+/g, '')
    document.documentElement.style.cssText = ''
  }

  /**
   * 注册主题
   * @param {string} name - 主题名称
   * @param {Object} variables - CSS变量
   */
  registerTheme(name, variables) {
    this.themes.set(name, variables)
  }

  /**
   * 获取所有模块
   */
  getModules() {
    return Array.from(this.modules.values())
  }

  /**
   * 获取模块信息
   * @param {string} name - 模块名称
   */
  getModule(name) {
    return this.modules.get(name)
  }

  /**
   * 检查模块是否已初始化
   * @param {string} name - 模块名称
   */
  isModuleInitialized(name) {
    const module = this.modules.get(name)
    return module ? module.initialized : false
  }

  /**
   * 获取当前模块
   */
  getCurrentModule() {
    return this.currentModule
  }

  /**
   * 初始化管理器
   */
  async initialize() {
    if (this.initialized) return

    // 注册默认主题
    this.registerTheme('default', {
      primary: '#42b883',
      secondary: '#35495e',
      background: '#ffffff',
      surface: '#f5f5f5',
      text: '#333333',
      'on-primary': '#ffffff',
      'on-secondary': '#ffffff',
      'on-background': '#333333',
      'on-surface': '#333333'
    })

    // 初始化预注册的模块
    for (const [name, module] of this.modules) {
      if (module.autoInit) {
        try {
          await this.initModule(name)
        } catch (error) {
          console.warn(`Failed to auto-init module '${name}':`, error)
        }
      }
    }

    this.initialized = true
    console.log('MicroFrontendManager initialized')
  }
}

// 创建全局实例
const microFrontendManager = new MicroFrontendManager()

export default microFrontendManager
export { MicroFrontendManager }